#!/bin/bash

# 小智ESP32服务器端服务管理脚本
# 用于管理服务的启动、停止、重启和状态查看

set -e

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 服务名称
SERVICE_NAME="xiaozhi-server"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"

# 日志目录
LOG_DIR="/tmp/xiaozhi-logs"
SERVICE_LOG="${LOG_DIR}/server.log"
ERROR_LOG="${LOG_DIR}/server-error.log"

# 项目路径
PROJECT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为root用户
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "请使用sudo运行此脚本"
        exit 1
    fi
}

# 检查服务文件是否存在
check_service() {
    if [[ ! -f "$SERVICE_FILE" ]]; then
        log_error "服务文件不存在: $SERVICE_FILE"
        log_info "请先运行安装脚本: sudo ./install_deps.sh"
        exit 1
    fi
}

# 创建日志目录
create_log_dir() {
    if [[ ! -d "$LOG_DIR" ]]; then
        mkdir -p "$LOG_DIR"
        chown xiaozhi:xiaozhi "$LOG_DIR"
    fi
}

# 启动服务
start_service() {
    log_info "正在启动${SERVICE_NAME}服务..."
    
    create_log_dir
    
    if systemctl is-active --quiet "$SERVICE_NAME"; then
        log_warning "服务已经在运行中"
        return 0
    fi
    
    systemctl start "$SERVICE_NAME"
    
    # 等待服务启动
    sleep 3
    
    if systemctl is-active --quiet "$SERVICE_NAME"; then
        log_success "服务启动成功"
        show_status
    else
        log_error "服务启动失败"
        show_logs 50
        exit 1
    fi
}

# 停止服务
stop_service() {
    log_info "正在停止${SERVICE_NAME}服务..."
    
    if ! systemctl is-active --quiet "$SERVICE_NAME"; then
        log_warning "服务已经停止"
        return 0
    fi
    
    systemctl stop "$SERVICE_NAME"
    
    # 等待服务停止
    sleep 2
    
    if ! systemctl is-active --quiet "$SERVICE_NAME"; then
        log_success "服务停止成功"
    else
        log_error "服务停止失败"
        exit 1
    fi
}

# 重启服务
restart_service() {
    log_info "正在重启${SERVICE_NAME}服务..."
    
    create_log_dir
    
    systemctl restart "$SERVICE_NAME"
    
    # 等待服务重启
    sleep 3
    
    if systemctl is-active --quiet "$SERVICE_NAME"; then
        log_success "服务重启成功"
        show_status
    else
        log_error "服务重启失败"
        show_logs 50
        exit 1
    fi
}

# 查看服务状态
show_status() {
    log_info "服务状态信息："
    echo "========================================"
    systemctl status "$SERVICE_NAME" --no-pager -l
    echo "========================================"
}

# 查看服务信息
show_info() {
    log_info "服务详细信息："
    echo "========================================"
    echo "服务名称: $SERVICE_NAME"
    echo "服务文件: $SERVICE_FILE"
    echo "项目路径: $PROJECT_PATH"
    echo "日志目录: $LOG_DIR"
    echo "========================================"
    
    if systemctl is-active --quiet "$SERVICE_NAME"; then
        log_success "服务状态: 运行中"
        echo "进程ID: $(systemctl show -p MainPID "$SERVICE_NAME" | cut -d= -f2)"
        echo "运行时间: $(systemctl show -p ActiveEnterTimestamp "$SERVICE_NAME" | cut -d= -f2)"
    else
        log_warning "服务状态: 已停止"
    fi
    
    echo "========================================"
    echo "开机自启: $(systemctl is-enabled "$SERVICE_NAME" 2>/dev/null || echo '未启用')"
    echo "========================================"
}

# 查看日志
show_logs() {
    local lines=${1:-100}
    local log_type=${2:-service}
    
    case "$log_type" in
        service)
            log_info "查看服务日志 (最近 $lines 行):"
            journalctl -u "$SERVICE_NAME" -n "$lines" --no-pager
            ;;
        stdout)
            if [[ -f "$SERVICE_LOG" ]]; then
                log_info "查看标准输出日志 (最近 $lines 行):"
                tail -n "$lines" "$SERVICE_LOG"
            else
                log_warning "标准输出日志文件不存在: $SERVICE_LOG"
            fi
            ;;
        stderr)
            if [[ -f "$ERROR_LOG" ]]; then
                log_info "查看错误日志 (最近 $lines 行):"
                tail -n "$lines" "$ERROR_LOG"
            else
                log_warning "错误日志文件不存在: $ERROR_LOG"
            fi
            ;;
        all)
            show_logs "$lines" service
            echo ""
            show_logs "$lines" stdout
            echo ""
            show_logs "$lines" stderr
            ;;
        *)
            log_error "未知的日志类型: $log_type"
            log_info "支持的日志类型: service, stdout, stderr, all"
            ;;
    esac
}

# 实时查看日志
follow_logs() {
    local log_type=${1:-service}
    
    case "$log_type" in
        service)
            log_info "实时查看服务日志 (按 Ctrl+C 退出):"
            journalctl -u "$SERVICE_NAME" -f
            ;;
        stdout)
            if [[ -f "$SERVICE_LOG" ]]; then
                log_info "实时查看标准输出日志 (按 Ctrl+C 退出):"
                tail -f "$SERVICE_LOG"
            else
                log_warning "标准输出日志文件不存在: $SERVICE_LOG"
            fi
            ;;
        stderr)
            if [[ -f "$ERROR_LOG" ]]; then
                log_info "实时查看错误日志 (按 Ctrl+C 退出):"
                tail -f "$ERROR_LOG"
            else
                log_warning "错误日志文件不存在: $ERROR_LOG"
            fi
            ;;
        *)
            log_error "未知的日志类型: $log_type"
            ;;
    esac
}

# 启用开机自启
enable_autostart() {
    log_info "正在启用开机自启..."
    systemctl enable "$SERVICE_NAME"
    log_success "开机自启已启用"
}

# 禁用开机自启
disable_autostart() {
    log_info "正在禁用开机自启..."
    systemctl disable "$SERVICE_NAME"
    log_success "开机自启已禁用"
}

# 重新加载服务配置
reload_config() {
    log_info "正在重新加载服务配置..."
    systemctl daemon-reload
    log_success "服务配置已重新加载"
}

# 测试服务连接
test_connection() {
    log_info "正在测试服务连接..."
    
    # 检查服务是否运行
    if ! systemctl is-active --quiet "$SERVICE_NAME"; then
        log_error "服务未运行，请先启动服务"
        exit 1
    fi
    
    # 检查端口监听
    local ports=("8000" "8001" "8002")  # 根据实际配置修改
    
    for port in "${ports[@]}"; do
        if netstat -tuln 2>/dev/null | grep -q ":$port "; then
            log_success "端口 $port 正在监听"
        else
            log_warning "端口 $port 未监听"
        fi
    done
    
    # 检查进程
    local process_count=$(pgrep -f "python.*app.py" | wc -l)
    if [[ $process_count -gt 0 ]]; then
        log_success "检测到 $process_count 个服务进程"
    else
        log_warning "未检测到服务进程"
    fi
}

# 清理日志
clean_logs() {
    log_info "正在清理日志文件..."
    
    if [[ -d "$LOG_DIR" ]]; then
        rm -f "$SERVICE_LOG" "$ERROR_LOG"
        create_log_dir
        log_success "日志文件已清理"
    else
        log_warning "日志目录不存在: $LOG_DIR"
    fi
    
    # 清理journal日志
    journalctl --vacuum-time=1d
    log_success "系统日志已清理"
}

# 显示帮助信息
show_help() {
    echo "========================================"
    echo "小智ESP32服务器端服务管理脚本"
    echo "========================================"
    echo ""
    echo "使用方法: $0 [命令] [选项]"
    echo ""
    echo "命令:"
    echo "  start              启动服务"
    echo "  stop               停止服务"
    echo "  restart            重启服务"
    echo "  status             查看服务状态"
    echo "  info               查看服务详细信息"
    echo "  logs [类型] [行数] 查看日志"
    echo "  follow [类型]      实时查看日志"
    echo "  enable             启用开机自启"
    echo "  disable            禁用开机自启"
    echo "  reload             重新加载服务配置"
    echo "  test               测试服务连接"
    echo "  clean              清理日志文件"
    echo "  help               显示帮助信息"
    echo ""
    echo "日志类型:"
    echo "  service            系统服务日志 (默认)"
    echo "  stdout             标准输出日志"
    echo "  stderr             错误日志"
    echo "  all                所有日志"
    echo ""
    echo "示例:"
    echo "  $0 start                    # 启动服务"
    echo "  $0 logs service 50          # 查看最近50行服务日志"
    echo "  $0 follow stderr            # 实时查看错误日志"
    echo "  $0 test                     # 测试服务连接"
    echo "========================================"
}

# 主函数
main() {
    local command=${1:-help}
    
    case "$command" in
        start)
            check_root
            check_service
            start_service
            ;;
        stop)
            check_root
            check_service
            stop_service
            ;;
        restart)
            check_root
            check_service
            restart_service
            ;;
        status)
            check_root
            check_service
            show_status
            ;;
        info)
            check_root
            check_service
            show_info
            ;;
        logs)
            check_root
            check_service
            show_logs "${3:-100}" "${2:-service}"
            ;;
        follow)
            check_root
            check_service
            follow_logs "${2:-service}"
            ;;
        enable)
            check_root
            check_service
            enable_autostart
            ;;
        disable)
            check_root
            check_service
            disable_autostart
            ;;
        reload)
            check_root
            reload_config
            ;;
        test)
            check_root
            check_service
            test_connection
            ;;
        clean)
            check_root
            clean_logs
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            log_error "未知命令: $command"
            show_help
            exit 1
            ;;
    esac
}

# 运行主函数
main "$@"